Var 會全域宣告,所以很容易汙染作用域,ES6 改變變數型態宣告方式,從單純的 var 增加為 let、const ,都是用來宣告區塊裡的變數,區塊 = {}。
console.log(a); // undefined
var a = 1;
console.log(b); // 錯誤:b is not defined
let b = 2;
ES5 只提供「 全局作用域 」跟「 函式作用域 」,要嘛就是危險的暴露在全域、要嘛就是用 function 包起來,所以 let 跟 const 提供了更多的選擇。
let、const 的作用域是在大括號 { } 裡面,稱為「 塊級作用域 」。 大大降低了污染到其他變數的可能性。
var a = 0;
function changeA(){
let a = 1;
console.log(a);
}
changeA();
console.log(a);
//輸出
1 //函式裡的數字先出來,已經在區塊裡用 let指定a=1,在函式console(a)出來就是1
0 //就換函式裡的a=1,在函式外頭的console(a)還是最早先var a = 0,沒有汙染到全域變數。
單純的唯獨,不能去做修改,變數是不能被變更、只能讀取的時候,我們稱為常數,常見的有圓周率、URL網址、預設的值不想被變更時等等。
但是不能變更是指記憶體位置,在 object{}
、array[]
裡還是可以變動修改
const obj = {
url: 'http://abc.com'
}
obj.url = 'x'
console.log(obj.url)
//輸出結果
x //物件中的 url 值被變更成 X 了
如果要讓const在物件中也不能更改的話,就是用 freeze()
凍結,就能讓物件凍結無法更改
const obj = {
url: 'http://abc.com'
}
Object.freeze(obj)
obj.url = 'B'
console.log(obj.url)
//輸出結果
http://abc.com 內容不變,因為已經用freeze()凍結了
for (var i= 0; i< 10; i++) {
setTimeout(function() {
console.log('這執行第' + i + '次');
},10);
}
console.log(i)
// 輸出結果: 10 這執行第10次
如果使用 var 應用 for 迴圈裡,var 是全域宣告變數,因此會等 i 都跑完結果,出現 10,
而 setTimeout 是非同步,會等到結果再執行 setTimeout,所以等 i 跑完到 10 結束之後,
把10套用到 setTimeout ,因此就只跑一次。
想要依序跑出來,就要改用 let
for (let i= 0; i< 10; i++) {
setTimeout(function() {
console.log('這執行第' + i + '次');
},0);
}
// console.log(i) // 無法再全域呼叫 i ,否則會報錯
// 輸出結果: 這執行第0次 ..... 這執行第9次
// 就會依序執行
const personA = {
name:'小明',
home:'小明家',
money: 500
}
person.name = '花道';
person.home = '花道家';
person.money = 1000;
person;
// person = {} // 如果賦予其他物件上,就會報錯
// 輸出結果: {name: "花道", money: 500}
const 無法改變的是物件本身,但是還是可以對物件的屬性為字串值做改變,因為物件傳參考的特性,但是數值無法更動。